home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / fsdm / fsdmFileDesc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-19  |  9.4 KB  |  319 lines

  1. /* 
  2.  * fsdmFileDesc.c --
  3.  *
  4.  *    Routines to allocate, initialize, and free file descriptors.
  5.  *
  6.  * Copyright 1987 Regents of the University of California
  7.  * All rights reserved.
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  */
  16.  
  17. #ifndef lint
  18. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/fsdm/fsdmFileDesc.c,v 9.3 91/07/26 09:48:16 mendel Exp $ SPRITE (Berkeley)";
  19. #endif not lint
  20.  
  21. #include <sprite.h>
  22. #include <fs.h>
  23. #include <fsutil.h>
  24. #include <fsconsist.h>
  25. #include <fslcl.h>
  26. #include <fsNameOps.h>
  27. #include <fsio.h>
  28. #include <fsStat.h>
  29. #include <fsdm.h>
  30.  
  31. #include <stdio.h>
  32.  
  33. /*
  34.  *----------------------------------------------------------------------
  35.  *
  36.  * Fsdm_GetNewFileNumber() --
  37.  *
  38.  *    Get a new file number by allocating a free file descriptor
  39.  *    from the file descriptor bitmap.
  40.  *
  41.  * Results:
  42.  *    An error if could not find a free file descriptor.
  43.  *
  44.  * Side effects:
  45.  *    fileNumberPtr is set to the number of the file descriptor allocated.
  46.  *
  47.  *----------------------------------------------------------------------
  48.  */
  49.  
  50. ENTRY ReturnStatus
  51. Fsdm_GetNewFileNumber(domainPtr, dirFileNum, fileNumberPtr)
  52.     register Fsdm_Domain     *domainPtr;    /* Domain to allocate the file 
  53.                      * descriptor out of. */
  54.     int            dirFileNum;    /* File number of the directory that
  55.                        the file is in.  -1 means that
  56.                        this file descriptor is being
  57.                        allocated for a directory. */
  58.     int            *fileNumberPtr; /* Place to return the number of
  59.                        the file descriptor allocated. */
  60. {
  61.     ReturnStatus status;
  62.     status = domainPtr->domainOpsPtr->getNewFileNumber(domainPtr, dirFileNum,
  63.                     fileNumberPtr);
  64. #ifdef lint
  65.     status = Lfs_GetNewFileNumber(domainPtr, dirFileNum, fileNumberPtr);
  66.     status = Ofs_GetNewFileNumber(domainPtr, dirFileNum, fileNumberPtr);
  67. #endif /* lint */
  68.     return status;
  69. }
  70.  
  71.  
  72. /*
  73.  *----------------------------------------------------------------------
  74.  *
  75.  * Fsdm_FreeFileNumber() --
  76.  *
  77.  *    Free a file number by clearing the corresponding bit the in
  78.  *    file descriptor bit map.
  79.  *
  80.  * Results:
  81.  *    SUCCESS.
  82.  *
  83.  * Side effects:
  84.  *    Bit map modified.
  85.  *
  86.  *----------------------------------------------------------------------
  87.  */
  88.  
  89. ENTRY ReturnStatus
  90. Fsdm_FreeFileNumber(domainPtr, fileNumber)
  91.     register Fsdm_Domain     *domainPtr;    /* Domain that the file 
  92.                      * descriptor is in. */
  93.     int            fileNumber;     /* Number of file descriptor to 
  94.                        free.*/
  95. {
  96.     ReturnStatus status;
  97.     status = domainPtr->domainOpsPtr->freeFileNumber(domainPtr, fileNumber);
  98. #ifdef lint
  99.     status = Lfs_FreeFileNumber(domainPtr, fileNumber);
  100.     status = Ofs_FreeFileNumber(domainPtr, fileNumber);
  101. #endif /* lint */
  102.     return status;
  103. }
  104.  
  105.  
  106. /*
  107.  *----------------------------------------------------------------------
  108.  *
  109.  * Fsdm_FileDescInit() --
  110.  *
  111.  *    Initialize a new file descriptor.
  112.  *
  113.  * Results:
  114.  *    An error if could not read the file descriptor from disk.
  115.  *
  116.  * Side effects:
  117.  *    The file decriptor is initialized.
  118.  *
  119.  *----------------------------------------------------------------------
  120.  */
  121.  
  122. ReturnStatus
  123. Fsdm_FileDescInit(domainPtr, fileNumber, type, permissions, uid, gid, 
  124.             fileDescPtr)
  125.     register Fsdm_Domain     *domainPtr;    /* Domain of the file */
  126.     int            fileNumber;     /* Number of file descriptor */
  127.     int            type;        /* Type of the file */
  128.     int            permissions;    /* Permission bits for the file */
  129.     int            uid;        /* Owner ID for the file */
  130.     int            gid;        /* Group ID for the file */
  131.     Fsdm_FileDescriptor    *fileDescPtr;    /* File descriptor structure to
  132.                        initialize. */
  133. {
  134.  
  135.     ReturnStatus status;
  136.     status = domainPtr->domainOpsPtr->fileDescInit
  137.     (domainPtr, fileNumber, type, permissions, uid, gid, fileDescPtr);
  138. #ifdef lint
  139.     status = Lfs_FileDescInit(domainPtr, fileNumber, type, permissions,
  140.                     uid, gid, fileDescPtr);
  141.     status = Ofs_FileDescInit(domainPtr, fileNumber, type, permissions,
  142.                     uid, gid, fileDescPtr);
  143. #endif /* lint */
  144.  
  145.     return status;
  146. }
  147.  
  148. /*
  149.  *----------------------------------------------------------------------
  150.  *
  151.  * Fsdm_FileDescFetch() --
  152.  *
  153.  *    Fetch the given file descriptor from disk and store it into
  154.  *    *fileDescPtr.
  155.  *
  156.  * Results:
  157.  *    An error if could not read the file descriptor from disk.
  158.  *
  159.  * Side effects:
  160.  *    *fileDescPtr is modified.
  161.  *
  162.  *----------------------------------------------------------------------
  163.  */
  164.  
  165. ReturnStatus
  166. Fsdm_FileDescFetch(domainPtr, fileNumber, fileDescPtr)
  167.     register Fsdm_Domain     *domainPtr;    /* Domain to fetch the file 
  168.                      * descriptor from. */
  169.     register int    fileNumber;     /* Number of file descriptor to 
  170.                        fetch.*/
  171.     Fsdm_FileDescriptor    *fileDescPtr;    /* File descriptor structure to
  172.                        initialize. */
  173. {
  174.     ReturnStatus status;
  175.     status = domainPtr->domainOpsPtr->fileDescFetch(domainPtr, fileNumber,
  176.         fileDescPtr);
  177. #ifdef lint
  178.     status = Lfs_FileDescFetch(domainPtr, fileNumber, fileDescPtr);
  179.     status = Ofs_FileDescFetch(domainPtr, fileNumber, fileDescPtr);
  180. #endif /* lint */
  181.      return status;
  182. }
  183.  
  184.  
  185. /*
  186.  *----------------------------------------------------------------------
  187.  *
  188.  * Fsdm_FileDescStore() --
  189.  *
  190.  *    Store the given file descriptor back into the file system block
  191.  *    where it came from.  This involves putting the block back into
  192.  *    the cache.
  193.  *
  194.  * Results:
  195.  *    An error if could not read the file descriptor from disk.
  196.  *
  197.  * Side effects:
  198.  *    Cache block is modified.
  199.  *
  200.  *----------------------------------------------------------------------
  201.  */
  202.  
  203. ReturnStatus
  204. Fsdm_FileDescStore(handlePtr, forceOut)
  205.     Fsio_FileIOHandle    *handlePtr;
  206.     Boolean        forceOut;  /* Force the change to disk. */
  207. {
  208.     register Fsdm_Domain     *domainPtr;    /* Domain to store the file 
  209.                      * descriptor into. */
  210.     int            fileNumber;     /* Number of file descriptor to 
  211.                        store.*/
  212.     Fsdm_FileDescriptor    *fileDescPtr;    
  213.     register ReturnStatus   status;
  214.  
  215.     domainPtr = Fsdm_DomainFetch(handlePtr->hdr.fileID.major, TRUE);
  216.     fileNumber = handlePtr->hdr.fileID.minor;
  217.     fileDescPtr = handlePtr->descPtr;
  218.     if (fileNumber == 0) {
  219.     Fsdm_DomainRelease(handlePtr->hdr.fileID.major);
  220.     panic( "Fsdm_FileDescStore: file #0\n");
  221.     return(FAILURE);
  222.     }
  223.     status = domainPtr->domainOpsPtr->fileDescStore(domainPtr, handlePtr,
  224.             fileNumber, fileDescPtr, forceOut);
  225. #ifdef lint
  226.     status = Lfs_FileDescStore(domainPtr, handlePtr, fileNumber, fileDescPtr,
  227.                     forceOut);
  228.     status = Ofs_FileDescStore(domainPtr, handlePtr, fileNumber, fileDescPtr,
  229.                     forceOut);
  230. #endif /* lint */
  231.     Fsdm_DomainRelease(handlePtr->hdr.fileID.major);
  232.  
  233.     return(status);
  234. }
  235.  
  236. /*
  237.  *----------------------------------------------------------------------
  238.  *
  239.  * Fsdm_UpdateDescAttr --
  240.  *
  241.  *    Update the attribute in the FileDesc from those in the cached 
  242.  *    attributes.
  243.  *
  244.  * Results:
  245.  *    None.
  246.  *
  247.  * Side effects:
  248.  *    File descriptor block forced to disk.
  249.  *
  250.  *----------------------------------------------------------------------
  251.  */
  252. ReturnStatus
  253. Fsdm_UpdateDescAttr(handlePtr, attrPtr, dirtyFlags)
  254.     register Fsio_FileIOHandle    *handlePtr;    /* Handle of file. */
  255.     register Fscache_Attributes *attrPtr;    /* Cached attributes of file. */
  256.     int        dirtyFlags;          /* Bit FSDM_FD_ bits of attributes
  257.                        * check. -1 means update all. */
  258. {
  259.     register Fsdm_FileDescriptor    *descPtr;
  260.     register ReturnStatus         status = SUCCESS;
  261.  
  262.     descPtr = handlePtr->descPtr;
  263.     if (dirtyFlags == -1) { 
  264.     /*
  265.      * If the handle times differ from the descriptor times then force
  266.      * them out to the descriptor.
  267.      */
  268.     if (descPtr->accessTime < attrPtr->accessTime) {
  269.         descPtr->accessTime = attrPtr->accessTime;
  270.         descPtr->flags |= FSDM_FD_ACCESSTIME_DIRTY;
  271.     }
  272.     if (descPtr->dataModifyTime < attrPtr->modifyTime) {
  273.         descPtr->dataModifyTime = attrPtr->modifyTime;
  274.         descPtr->flags |= FSDM_FD_MODTIME_DIRTY;
  275.         if (descPtr->dataModifyTime > descPtr->descModifyTime) {
  276.         descPtr->descModifyTime = descPtr->dataModifyTime;
  277.         descPtr->flags |= FSDM_FD_OTHERS_DIRTY;
  278.         }
  279.     }
  280.     if (descPtr->dataModifyTime > descPtr->descModifyTime) {
  281.         descPtr->descModifyTime = descPtr->dataModifyTime;
  282.         descPtr->flags |= FSDM_FD_OTHERS_DIRTY;
  283.     }
  284.     if (descPtr->userType != attrPtr->userType) {
  285.         descPtr->userType = attrPtr->userType;
  286.         descPtr->flags |= FSDM_FD_USERTYPE_DIRTY;
  287.     }
  288.     } else if (dirtyFlags & FSDM_FD_ACCESSTIME_DIRTY) {
  289.     if (descPtr->accessTime < attrPtr->accessTime) {
  290.         descPtr->accessTime = attrPtr->accessTime;
  291.         descPtr->flags |= FSDM_FD_ACCESSTIME_DIRTY;
  292.     }
  293.     } else if (dirtyFlags & FSDM_FD_MODTIME_DIRTY) {
  294.     if (descPtr->dataModifyTime < attrPtr->modifyTime) {
  295.         descPtr->dataModifyTime = attrPtr->modifyTime;
  296.         descPtr->flags |= FSDM_FD_MODTIME_DIRTY;
  297.     }
  298.     if (descPtr->dataModifyTime > descPtr->descModifyTime) {
  299.         descPtr->descModifyTime = descPtr->dataModifyTime;
  300.         descPtr->flags |= FSDM_FD_OTHERS_DIRTY;
  301.     }
  302.     } else if (dirtyFlags & FSDM_FD_USERTYPE_DIRTY) {
  303.     if (descPtr->userType != attrPtr->userType) {
  304.         descPtr->userType = attrPtr->userType;
  305.         descPtr->flags |= FSDM_FD_USERTYPE_DIRTY;
  306.     }
  307.    }
  308.    if (descPtr->flags & FSDM_FD_DIRTY) {
  309.     status =  Fsdm_FileDescStore(handlePtr, FALSE);
  310.     if (status != SUCCESS) {
  311.         printf(
  312.         "Fsdm_UpdateDescAttr: Could not put desc <%d,%d> into cache\n",
  313.             handlePtr->hdr.fileID.major,
  314.             handlePtr->hdr.fileID.minor);
  315.     }
  316.     }
  317.     return(status);
  318. }
  319.